home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
gfx
/
show
/
aMiPEG_1_1_src.lha
/
aMiPEG_1.1
/
src
/
svideo.s
< prev
next >
Wrap
Text File
|
1997-12-02
|
21KB
|
1,054 lines
;
; Some practical assembler utility routines. See sutils.h for corresponding C prototypes.
; These are mostly called from within video.c as most of them are kinda copy
; routines which handle cropping and adding together different-sized channels.
;
; Michael Rausch 14-4-94 1:14:30
;
SECTION text,CODE
ER EQU -1
OK EQU 1
UNDERFLOW EQU -2
XREF @correct_underflow
XREF _bitBuffer
XREF _bufLength
XREF _bitBuffer
XREF _bitOffset
; XREF _bitCount ; ANALYSIS
; XREF _mbCoeffPtr ; ANALYSIS
XREF _dct_coeff_first
XREF _dct_coeff_next
XREF _dct_coeff_tbl_0
XREF _dct_coeff_tbl_1
XREF _dct_coeff_tbl_2
XREF _dct_coeff_tbl_3
XREF _clamp
; ***************************************************************
XDEF @next_start_code
@next_start_code:
moveq #120,d1 ; was 2
cmp.l _bufLength(a4),d1
ble.s nsc_nc
bsr @correct_underflow
nsc_nc:
move.l d2,a1
move.l _bitOffset(a4),d1
move.l _bitBuffer(a4),a0
move.l _bufLength(a4),d2
moveq #7,d0
and.l d1,d0
beq.s nsc_is_byte_border
addq.l #8,d1
sub.l d0,d1
moveq #32,d0
cmp.l d0,d1
blt.s nsc_is_byte_border
sub.l d0,d1
addq.l #4,a0
subq.l #1,d2
nsc_is_byte_border:
lsr.l #3,d1
add.l d1,a0 ; a0 is on a longword bound, so align a0 to the byte boundary
lsl.l #2,d2
add.l a0,d2 ; end of the buffer
move.w (a0)+,d0 ; prefetch 16 bits
moveq #1,d1
nsc_loop:
cmp.l d2,a0
bge.s nsc_underflow
ext.l d0 ; this one is critical!
lsl.l #8,d0
move.b (a0)+,d0
; tst.l d0
; beq.s nsc_found
cmp.l d1,d0
bne.s nsc_loop
nsc_found:
subq.l #3,a0 ; last 24 bits are the new startcode
move.l a0,d1
and.l #3,d1
sub.l d1,a0 ; new bitBuffer
lsl.l #3,d1 ; new bitOffset
sub.l a0,d2 ; new bufLength
lsr.l #2,d2
move.l a0,_bitBuffer(a4)
move.l d1,_bitOffset(a4)
move.l d2,_bufLength(a4)
move.l a1,d2
moveq #OK,d0
rts
nsc_underflow:
move.l a0,_bitBuffer(a4) ; i.e. exact end of buffer
clr.l _bitOffset(a4) ; no data available anymore
clr.l _bufLength(a4)
move.l a1,d2
moveq #UNDERFLOW,d0
rts
; ***************************************************************
XDEF @s_DecodeCBP
@s_DecodeCBP:
moveq #9,d0
lea _coded_block_pattern,a0
bra.s @s_get_byte_huff
XDEF @sn_DecodeCBP
@sn_DecodeCBP:
moveq #9,d0
lea _coded_block_pattern,a0
bra.s @sn_get_byte_huff
gsh_x: move.l d2,-(sp)
move.l a0,-(sp)
move.l d0,d2
bsr @correct_underflow
move.l d2,d0
move.l (sp)+,a0
bra.s sngsh
XDEF @s_get_byte_huff
@s_get_byte_huff:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s gsh_x
XDEF @sn_get_byte_huff
@sn_get_byte_huff:
move.l d2,-(sp)
sngsh:
move.l _bitOffset(a4),d1
move.l _bitBuffer(a4),a1
bfextu (a1){d1:d0},d2
move.w (a0,d2.w*2),d0
moveq #0,d2
move.b d0,d2
; add.l d2,_bitCount(a4) ; ANALYSIS
add.l d1,d2
moveq #32,d1
cmp.l d1,d2
blt.s sgdhw
sub.l d1,d2
addq.l #4,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
sgdhw:
move.l d2,_bitOffset(a4)
lsr.w #8,d0
extb.l d0
move.l (sp)+,d2
rts
; ***************************************************************
XDEF @s_DecodeDCTDCSizeLum
@s_DecodeDCTDCSizeLum:
moveq #7,d1
lea _dct_dc_size_luminance,a1
bra.s sdlc
XDEF @s_DecodeDCTDCSizeChrom
@s_DecodeDCTDCSizeChrom:
moveq #8,d1
lea _dct_dc_size_chrominance,a1
sdlc: move.l d2,-(sp)
move.l d3,-(sp)
move.l _bitOffset(a4),d0
move.l _bitBuffer(a4),a0
moveq #16,d3
bfextu (a0){d0:d3},d2
move.l d2,d0
sub.l d1,d3
lsr.l d3,d0
move.w (a1,d0.w*2),d0 ; macroval
move.b d0,d3 ; flushed.l
lsl.w d3,d2
lsr.w d3,d2 ; mask off the header
lsr.w #8,d0 ; size
tst.w d0 ; necessary ?
beq.s cdlflush
add.w d0,d3
moveq #16,d1
sub.l d3,d1
lsr.l d1,d2 ; trash unused lower bits
subq.l #1,d0 ; MPEG has some really strange sign extension, just like JPEG! Weirdo!
btst d0,d2
bne cdlsign
moveq #-2,d1
lsl.l d0,d1
or.l d1,d2
addq.l #1,d2
cdlsign: move.l d2,d0 ; the desired result
cdlflush:
; add.l d3,_bitCount(a4) ; ANALYSIS
add.l _bitOffset(a4),d3
moveq #32,d1
cmp.l d1,d3
blt.s cdlXw
sub.l d1,d3
addq.l #4,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
cdlXw:
move.l d3,_bitOffset(a4)
move.l (sp)+,d3
move.l (sp)+,d2
rts
; ***************************************************************
sgb1: bsr @correct_underflow
bra.s @sn_get_bits1
XDEF @s_get_bits1
@s_get_bits1:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s sgb1
XDEF @sn_get_bits1
@sn_get_bits1:
; addq.l #1,_bitCount(a4) ; ANALYSIS
move.l _bitBuffer(a4),a0
move.l _bitOffset(a4),d1
moveq #1,d0 ; hmm ?!
bfextu (a0){d1:d0},d0
addq.l #1,d1
btst #5,d1
beq.s gb1r
addq.l #4,a0
moveq #0,d1
move.l a0,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
gb1r: move.l d1,_bitOffset(A4)
rts
sgbX: move.l d0,-(sp)
bsr @correct_underflow
move.l (sp)+,d0
bra.s @sn_get_bitsX
XDEF @s_get_bitsX
@s_get_bitsX:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s sgbX
XDEF @sn_get_bitsX
@sn_get_bitsX:
; add.l d0,_bitCount(a4) ; ANALYSIS
move.l _bitOffset(a4),d1
move.l _bitBuffer(a4),a0
move.l d1,a1
add.l d0,a1
bfextu (a0){d1:d0},d0
moveq #32,d1
cmp.l d1,a1
blt.s gsbXw
sub.l d1,a1
addq.l #4,a0
move.l a0,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
gsbXw: move.l a1,_bitOffset(a4)
rts
; ***************************************************************
ssb32_ofoi:
bsr @correct_underflow ; ofoi OPT
bra.s @sn_show_bits32
XDEF @s_show_bits32
@s_show_bits32
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s ssb32_ofoi
XDEF @sn_show_bits32
@sn_show_bits32:
move.l _bitBuffer(a4),a0
move.l _bitOffset(a4),d1
moveq #32,d0
bfextu (a0){d1:d0},d0
rts
ssb_x: move.l d0,-(sp)
bsr @correct_underflow
move.l (sp)+,d0
bra.s @sn_show_bitsX
XDEF @s_show_bitsX
@s_show_bitsX
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s ssb_x
XDEF @sn_show_bitsX
@sn_show_bitsX:
move.l _bitOffset(a4),d1
move.l _bitBuffer(a4),a0
bfextu (a0){d1:d0},d0
rts
; ***************************************************************
sf32_ofoi:
bsr @correct_underflow ; moved away
bra.s @sn_flush_bits32
XDEF @s_flush_bits32
@s_flush_bits32:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s sf32_ofoi
XDEF @sn_flush_bits32
@sn_flush_bits32:
; add.l #32,_bitCount(a4) ; ANALYSIS
addq.l #4,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
rts
sf_outtafoi:
move.l d0,-(sp)
bsr @correct_underflow ; moved away, out of flow of instructions
move.l (sp)+,d0
bra.s @sn_flush_bits
XDEF @s_flush_bits
@s_flush_bits:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s sf_outtafoi
XDEF @sn_flush_bits
@sn_flush_bits:
; add.l d0,_bitCount(a4) ; ANALYSIS
add.l _bitOffset(a4),d0
moveq #32,d1
cmp.l d1,d0
blt.s sbf32
sub.l d1,d0
addq.l #4,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
sbf32: move.l d0,_bitOffset(a4)
rts
locallevel: ds.l 1
; ***************************************************************
bgsh_x: move.l a0,-(sp)
move.l d0,-(sp)
move.l a1,-(sp)
bsr @correct_underflow
move.l (sp)+,a1
move.l (sp)+,d0
bra.s bsngsh
XDEF @s_get_bits_huff
@s_get_bits_huff:
moveq #2,d1
cmp.l _bufLength(a4),d1
bgt.s bgsh_x
XDEF @sn_get_bits_huff
@sn_get_bits_huff:
move.l a0,-(sp)
bsngsh:
move.l _bitOffset(a4),d1
move.l _bitBuffer(a4),a0
bfextu (a0){d1:d0},d2
move.l (sp)+,a0
move.w (a1,d2.w*2),d0
bmi.s gbh_error
moveq #0,d2
move.b d0,d2
; add.l d2,_bitCount(a4) ; ANALYSIS
add.l d1,d2
moveq #32,d1
cmp.l d1,d2
blt.s bsgdhw
sub.l d1,d2
addq.l #4,_bitBuffer(a4)
subq.l #1,_bufLength(a4)
bsgdhw:
move.l d2,_bitOffset(a4)
lsr.w #8,d0
moveq #0,d1
lsr.w #1,d0
addx.w d1,d1
move.l d1,(a0) ; save intra
rts
gbh_error:
moveq #1,d0
move.l d0,(a0)
rts
; ***************************************************************
;void PMB2_reconstruct(char *dest, char *dest1, char *source, char *source1, int row_incr);
XDEF _PMB2_reconstruct
_PMB2_reconstruct:
subq.l #2,d0 ; (int*) correct row_size
lsl.l #2,d0
moveq #7,d1
pmb2_all_rows:
move.l (a2)+,(a0)+
move.l (a2)+,(a0)+
move.l (a3)+,(a1)+
move.l (a3)+,(a1)+
add.l d0,a0
add.l d0,a1
add.l d0,a2
add.l d0,a3
dbra d1,pmb2_all_rows
rts
; ***************************************************************
;void PMB1_reconstruct(char *dest, char *source, int row_incr);
XDEF _PMB1_reconstruct
_PMB1_reconstruct:
subq.l #4,d0 ; correct row_size
lsl.l #2,d0
moveq #15,d1
pmb1_all_rows